#ifndef PROTOCOL_H
#define PROTOCOL_H

#include <stdint.h>
#include "ring_buffer.h"

#pragma pack(push, 1)
typedef struct {
    uint8_t   head;      // 帧头（A5/A6）
    uint8_t   type;      // 功能码
    uint16_t  len;       // 数据长度（转义前）
    uint8_t   data[128]; // 数据区
    uint16_t  crc;       // CRC16（从head到data）
    uint8_t   end;       // 帧尾（A3）
} ProtocolFrame;
#pragma pack(pop)

// 协议解析状态机
typedef enum {
    STATE_WAIT_HEADER,
    STATE_READ_TYPE,
    STATE_READ_LEN_HIGH,
    STATE_READ_LEN_LOW,
    STATE_READ_DATA,
    STATE_READ_CRC_HIGH,
    STATE_READ_CRC_LOW,
    STATE_READ_END
} ProtocolState;

// 协议解析上下文
typedef struct {
    ProtocolState state;
    ProtocolFrame frame;
    int data_index;
    uint16_t expected_len;
} ProtocolParser;

// 函数声明
void parser_init(ProtocolParser *parser);
bool parser_process_byte(ProtocolParser *parser, uint8_t byte);
int protocol_encode(uint8_t head, uint8_t type, const uint8_t *data, uint16_t len, uint8_t *out_buf);

#endif // PROTOCOL_H
